const config = require('../../utils/config.js');
const { request } = require('../../utils/request.js'); // 引入封装的请求方法
const token = wx.getStorageSync('token'); // 从本地存储中获取 token

Page({
  data: {
    socket: null, //websocket实例
    socketOpen: false,
    dialogNumber: null, // 当前对话编号
    messages: [], // 当前对话的消息列表
    inputMessage: '', // 输入框内容
    dialogList: [], // 历史对话列表
    drawerOpen: false, // 抽屉状态
    isSystemNewMessage: true, // 是否是系统新消息
  },

  // 页面加载时执行
  onLoad() {
    this.fetchHistoryDialogs(); // 加载历史对话
    this.connectWebSocket();
  },

  // 建立 WebSocket 连接
  connectWebSocket: function() {
    // 连接到 WebSocket 服务
    const socket = wx.connectSocket({
      url: config.websocketUrl + '/wx/webSocketChat?Authorization=' + token
    });

    socket.onOpen(() => {
      this.setData({ 
        socket: socket,
        socketOpen: true
      });
      this.startNewDialog();
      console.log("WebSocket 已打开");
    });

    socket.onClose(() => {
      this.setData({ socketOpen: false });
      console.log("WebSocket 已关闭");
    });

    socket.onError((error) => {
      console.error("WebSocket 错误", error);
    });

    socket.onMessage((message) => {
      console.log("收到消息:", message);
      const newMessage = message.data; // 假设消息是 JSON 格式
      this.addMessageWithTypingEffect(newMessage);
    });
  },

    // 发送消息
    sendMessage() {
      // 获取输入框的值
      const inputValue = this.data.inputMessage;
      const trimmedValue = inputValue.trim();
      if(!trimmedValue){
        wx.showToast({
          title: '未输入消息',
          icon: 'none',
          duration: 2000
        });
        return; 
      }

      if (this.data.socketOpen) {
        const socket = this.data.socket; // 获取 WebSocket 任务
        const params = {
          message: trimmedValue,
          dialogNumber: this.data.dialogNumber
        }
        socket.send({
          data: JSON.stringify(params), // 发送 JSON 格式的数据
          success: () => {
            console.log("消息发送成功:", params);
            let userMessage = { 
              content: trimmedValue, 
              role : "user",
              createTime : new Date().toISOString()
             };
             this.data.messages.push(userMessage);
             // 更新页面上的消息列表，只更新新的消息
             this.setData({ 
               messages: this.data.messages,
               isSystemNewMessage: true,
               inputMessage: ''
            });
          },
          fail: (err) => {
            console.error("消息发送失败", err);
          }
        });
      } else {
        console.error("WebSocket 尚未连接或消息为空");
      }
  },

  addMessageWithTypingEffect: function(newMessage) {
     //如果是新消息，则进行消息列表拼接
     if(this.data.isSystemNewMessage){
       // 创建一个新的消息对象，初始内容为空字符串
      let typingMessage = { 
        ...newMessage, 
        content: '', 
        role : "assistant",
        createTime : new Date().toISOString()
       };
       this.data.messages.push(typingMessage);
       // 更新页面上的消息列表，只更新新的消息
       this.setData({ 
         messages: this.data.messages,
         isSystemNewMessage: false
      });

     }

    // 开始打字效果
    let index = this.data.messages.length - 1;
    let i = 0;

    const timer = setInterval(() => {
      if (i < newMessage.length) {
        // 每次添加一个字符到当前消息的内容中
        this.data.messages[index].content += newMessage.charAt(i++);
        this.setData({
          [`messages[${index}].content`]: this.data.messages[index].content
        });
      } else {
        clearInterval(timer); // 清除定时器
      }
    }, 400); // 调整间隔时间以改变打字速度
  },

  // 开始新对话
  startNewDialog() {
    request({
      url: '/wx/generatorDialogNumber',
      method: 'GET',
      requireAuth: true, // 使用封装的请求方法，会自动处理 Token
    })
      .then((res) => {
        this.setData({ dialogNumber: res.data.data }); // 保存对话编号
        wx.showToast({ title: '新对话已开始', icon: 'none' });
      })
      .catch((err) => {
        console.error('获取对话编号失败:', err);
        wx.showToast({ title: '对话编号获取失败', icon: 'none' });
      });
  },

  // 获取历史对话列表
  fetchHistoryDialogs() {
    request({
      url: '/wx/historyDialogs',
      method: 'GET',
      requireAuth: true,
    })
      .then((res) => {
        this.setData({ dialogList: res.data.data || [] });
      })
      .catch((err) => {
        console.error('加载历史对话失败:', err);
        wx.showToast({ title: '加载历史对话失败', icon: 'none' });
      });
  },

  // 加载对话详情
  loadDialog(e) {
    this.toggleDrawer();  //关闭抽屉
    const nowDialogNumber = e.currentTarget.dataset.dialognumber;
    request({
      url: '/wx/dialogDetail',
      method: 'GET',
      data: { 
        dialogNumber: nowDialogNumber 
      },
      requireAuth: true,
    })
      .then((res) => {
        console.log(res);
        this.setData({
          dialogNumber : nowDialogNumber, // 设置当前对话编号
          messages: res.data.data || [],
          drawerOpen: false, // 关闭抽屉
        });
        wx.showToast({ title: `已加载对话`, icon: 'none' });
      })
      .catch((err) => {
        console.error('加载历史对话失败:', err);
        wx.showToast({ title: '加载对话失败', icon: 'none' });
      });
  },

  // 输入框双向绑定
  onInput(e) {
    this.setData({ inputMessage: e.detail.value });
  },

  // 切换抽屉状态
  toggleDrawer() {
    this.setData({ drawerOpen: !this.data.drawerOpen });
  },
  InputFocus(e) {
    this.setData({
      InputBottom: e.detail.height
    })
  },
  InputBlur(e) {
    this.setData({
      InputBottom: 0
    })
  }
  
});
